Lab 1 - VHDL simulation

Part 1

 

Цел

 

Придобиване на практически опит за симулация на VHDL проекти.

 

Задание

Да се разработят поведенчески VHDL модели на различни цифрови схеми. Да се провери корекността на моделите посредством симулация.

 

Задача 1 -- D-Тригер управляван по ниво (фиксатор, latch)

Описанието на D-тригер управляван по ниво е показано на фигура 1, а съответния VHDL код е записан във файла dlb.vhd . Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него.


entity DLATCH is
    port (D, ENA: in bit; Q: out bit);
end DLATCH;

architecture BEHAVIOUR of DLATCH is
begin
    process (ENA, D)
    begin
        if ENA = '1' then
            Q <= D;
        end if;
    end process;
end BEHAVIOUR;

Фигура 1 -- VHDL модел на D-тригер управляван по ниво.

Разглеждания тригер (фиг. 1) има вход за данни D, изход Q и управляващ вход ENA. При подаване на логическа единица на входа ENA в тригера се записва информацията от входа D.

Модела на тригера е описан в проектната единица DLATCH. Поведението на модела се описва в архитектурата BEHAVIOR. В тази архитектура тригера е моделиран посредством процес, който се активира при промяна на сигналите ENA или D.

Симулирайте архитектурата BEHAVIOR на D-тригера и проверете адекватността на модела като наблюдавате резултатите от симулацията в графичен (прозорец Wave) и табличен вид (прозорец List). Обърнете внимание, че промените на изходния сигнал QOUT настъпват веднага след подаване на високо ниво на разрешаващия вход ENABLE. Такова поведение е характерно за функционалните модели. При тях не се специфицира бързодействието на моделиранта схема и симулатора работи с нулеви закъснения (делта закъснение според терминологията на VHDL).

Командите за симулация на модела са дадени на фигури 2 и 3.

Резултатите от симулацията са показани на фигура 4.


wave /*
force d 1 100, 0 200, 1 300
force ena 1 0, 0 150
run 300

Фигура  2 -- Команди за задаване на входни въздействия при симулацията

 



Фигура  3  -- Команден прозорец на VSystem

 



Фигура  4  -- Резултати от симулацията -- прозорец WAVE

 

 

Задача 2 -- D-Тригер управляван по ниво (вариант STD_LOGIC)

Във втория вариант на модела на D-тригер управляван по ниво са използвани сигнали от тип std_logic (фигура 5). VHDL кода е записан във файла dlb_std.vhd .


library IEEE;
use IEEE.std_logic_1164.all;

entity DLATCH is
    port (D, ENA: in std_logic; Q: out std_logic);
end DLATCH;

architecture BEHAVIOUR of DLATCH is
begin
    process (ENA, D)
    begin
        if ENA = '1' then
            Q <= D;
        end if;
    end process;
end BEHAVIOUR;

Фигура 5 -- VHDL mодел на D-тригер управляван по ниво -- вариант със сигнали от тип STD_LOGIC.

Силумирайте този модел на D-тригер и сравнете резултатите с резултатите от симулацията на модела от задача 1.

 

Задача 3 -- JK-тригер

Описанието на D-тригер управляван по ниво е показано на фигура 6, а съответния VHDL код е записан във файла jkb.vhd . Разгледайте дадения модел и се уверете, че разбирате смисъла на VHDL конструкциите в него. Обърнете внимание на начина по който се синхронизира процеса с нараствашия фронт на тригера.


library IEEE;
use IEEE.std_logic_1164.all;

entity JKFF is
    port (J, K, CLK : in std_logic; Q :buffer std_logic);
end JKFF;

architecture BEHAVIOR of JKFF is
begin
    process (CLK) begin
       if (CLK'event and CLK = '1') then
          if (J = '0' and K = '0') then
              Q <= Q after 10 ns;
          elsif (J = '0' and K = '1') then
              Q <= '0' after 10 ns;
          elsif (J = '1' and K = '0') then
              Q <= '1' after 10 ns;
          elsif (J = '1' and K = '1') then
              Q <= not Q after 10 ns;                     
          end if;
       end if;
    end process;
end BEHAVIOR;

Фигура 6 -- VHDL mодел на JK-тригер управляван по фронт.

Подгответе входни въздействия (т.е. команди force) за сигналите J, K и CLK  съгласно времедиаграмите показани на фигура 7.



Фигура 7 -- Входни въздействия за симулацията на JK-тригер

 

Указание

Описанието на периодичен сигнал се извършва посредством опцията -repeat на командата force:

force  описание на един период  -repeat  период

Например сигналът clk от фигура 7 може да се опише като

force clk 0 0, 1 50 -repeat 100

Симулирайте JK-тригера и проверете адекватността на модела като наблюдавате резултатите от симулацията в графичен вид. Обърнете внимание, че промените на изходния сигнал Q настъпват с известно закъснение спрямо тактовия сигнал CLK. Измерете това закъснение и обяснете на какво се дължи то.

 

Задача 4 -- D-Tригер управляван по фронт (flip-flop)

Целта на тази задача е да се разработи поведенчески модел на D-тригер, управляван по нарастващ фронт на тактовия сигнал CLK. Закъснението от фронта на тактовия сигнал до установяване на изхода Q да бъде 10 ns. Интерфейсната част на модела (entity) е дадена на фигура 8 и е записана във файл dff.vhd .  Да се разработи архитектурната част на модела и да се извърши симулация като в тригера последователно се записват стойностите 0, 1 и X.

 

Указание

За да се провери дали е на лице нарастващ фронт на сигнала CLK се използва следният оператор:
if (CLK = '1' and CLK'event) then 
    ... 
end if;

 

library IEEE;
use IEEE.std_logic_1164.all;

entity DFF is
    port (D, CLK: in std_logic; Q: buffer std_logic);
end DFF;

Фигура 8 -- Интерфейсна част на VHDL mодел на D-тригер управляван по фронт.

 

Задача 5 -- Симулация на D-Tригер управляван по ниво посредством тестова установка (test-bench)

Да се разработи тестова установка за проверка на модела на D-тригер разгледан в задача 2. Схемата на тази тестова установка е показана на фигура 9а.

Фигура 9а -- Тестова установка за симулация на D-тригер управляван по ниво

На фигура 9б е даден текста на тестовата установка, която се намира във файла dlb_std_tb.vhd .

Тестовата установка представлява самостоятелна проектна единица, която се компилира независимо от тествания модел. Моделът на тригера DLATCH се вклюява в тестовата установка посредством операторите component (ред 9 - 11) и port map (ред 17). Входните въздействия да се генерират от процеса STM (ред 19-34). Връзката между тествания модел и генератора на входните въздействия се осъществява посредством сигналите DT, ET и QT. Начинът по който тези сигнали се свързват към портовете на тествания модел се указва в оператора port map (ред 17).

Времедиаграмите на входните сигнали са показани на фигура 10.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
library IEEE;
use IEEE.std_logic_1164.all;

entity DLATCH_TB is 
end;

architecture TB of DLATCH_TB is

component DLATCH
    port (D, ENA: in std_logic; Q: out std_logic);
end component;

signal DT, ET, QT: std_logic;

begin

   UUT: DLATCH port map (DT, ET, QT);
   
   STM : process 
   begin
      DT <= '0'; ET <= '0';
      wait for 20 ns;
      DT <= '0'; ET <= '1';
      wait for 20 ns;    
      DT <= '1'; ET <= '1';
      wait for 20 ns;
      ET <= '1';
      DT <= '0' ,'X' after 15 ns, '1' after 20 ns; 
      wait for 30 ns;
      ET <= '0';
      DT <= '0' ,'X' after 15 ns, '1' after 20 ns;
      wait for 30 ns;
      wait;     
   end process STM;
   
end TB;


Фигура 9б -- Тестова установка за симулация на D-тригер управляван по ниво.

 


Фигура 10 -- Входни въздействия за симулация на D-тригер управляван по ниво

 

Задача 6 -- Симулация на D-Tригер управляван по фронт посредством тестова установка (test-bench)

Да се разработи тестова установка за проверка на модела от задача 4. Входните въздействия да се подават от два отделни процеса: DGEN за данните и CLKGEN за тактовия сигнал (фигура 11). Времедиаграмите на входните сигнали са показани също на фигура 11.

Генерирането на тактовия сигнал може да се опише по следния начин:
CLKGEN : process
begin
    CLK <= not CLK;
   wait for 25 ns;
end process;

 


Фигура 11 -- Тестова установка и входни въздействия за симулация на D-тригер

 

Задача 7 -- Автоматизирана тестова установка

В тази задача ще бъде извършена симулация на модела на  JK-тригер (виж задача 3) посредством тестова установка, която проверява коректността на резултатите от симулацията. При създаването на подобни "автоматизирани" тестови установки разработчикът трябва да укаже в кои моменти от симулацията ще се проверяват изходните на модела и какви са техните коректни стойности.

Текста на тестовата установка е даден на фигура 12 и във файла jkff_tb.vhd . Моделът на JK-тригера е даден във файл jkff_err.vhd . Проверките на изходните сигнали се извършват посредством операторите assert. Той има следния формат:

assert логическо условие report текст на съобщение за грешка;

 Ако логическото условие не е изпълнено се отпечатва момента на извършване на проверката и текста на съобщението за грешка.

Симулирайте модела на тригера и с помощта на съобщенията от тестовата установка намерете и отстранете допуснатата в модела грешка.

library IEEE;
use IEEE.std_logic_1164.all;

entity JKFF_TB is 
end;

architecture TB of JKFF_TB is

component JKFF
    port (J, K, CLK : in std_logic; Q :buffer std_logic);
end component;

signal J, K, Q : std_logic;
signal CLK : std_logic := '1';

begin

   UUT: JKFF port map (J, K, CLK, Q);

   STM : process begin

      -- apply the stimuls
      J <= '0'; K <= '1';

      -- wait for the outputs to settle
      wait for 100 ns;

      -- check the results
      assert Q = '0' report "Q is not 0";

      J <= '0'; K <= '0';
      wait for 100 ns;
      assert Q  = '0' report "Q is not 0";

      J <= '1'; K <= '0';
      wait for 100 ns;
      assert Q  = '1' report "Q is not 1";

      J <= '0'; K <= '0';
      wait for 100 ns;
      assert Q  = '1' report "Q is not 1";

      J <= '1'; K <= '1';
      wait for 100 ns; 
      assert Q  = '0' report "Q is not 0";

      wait for 100 ns; 
      assert Q  = '1' report "Q is not 1";

      wait for 100 ns; 
      assert Q  = '0' report "Q is not 0";

      wait;
   
   end process;
   
   CLOCK: process begin
      CLK <= not CLK;
      wait for 50 ns;
   end process;
   
end TB;

Фигура 12 -- Автоматизирана тестова установка за симулация на JK-тригер